home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 3: CDPD 3 / Almathera Ten on Ten - Disc 3: CDPD3.iso / ab20 / ab20_archive / datacomm / xpr / xprzmodem-2.51.lzh / xprzmodem2.5 / libinit.c < prev    next >
C/C++ Source or Header  |  1992-01-29  |  5KB  |  166 lines

  1. #define  _USEOLDEXEC_ 1
  2. #include <exec/types.h>
  3. #include <exec/nodes.h>
  4. #include <exec/memory.h>
  5. #include <exec/resident.h>
  6. #include <exec/libraries.h>
  7. #include <libraries/dos.h>
  8. #include <proto/exec.h>
  9. #include <proto/dos.h>
  10. #include <string.h>
  11.  
  12.  
  13. /* Prototypes */
  14. ULONG __saveds __asm _LibExpunge( register __a6 struct MyLibrary *libbase );
  15. ULONG __saveds __asm _LibInit( register __a0 APTR seglist,
  16.                                 register __d0 struct MyLibrary *libbase );
  17. void __saveds __asm _UserLibInit(register __a6 struct MyLibrary *libbase );
  18. void __saveds __asm _UserLibCleanup(register __a6 struct MyLibrary *libbase);
  19.  
  20. struct MyLibrary
  21. {
  22.    struct    Library ml_Lib;
  23.    ULONG    ml_SegList;
  24.    ULONG    ml_Flags;
  25.    APTR        ml_ExecBase;        /* pointer to exec base */
  26.    };
  27.  
  28. typedef LONG (*PFL)();   /* pointer to function returning 32-bit int */
  29.  
  30. /* library initialization table, used for AUTOINIT libraries */
  31. struct InitTable
  32. {
  33.    ULONG        *it_DataSize;        /* library data space size */
  34.    PFL          *it_FuncTable;        /* table of entry points */
  35.    APTR         it_DataInit;        /* table of data initializers */
  36.    PFL          it_InitFunc;        /* initialization function to run */
  37.    };
  38.  
  39.  
  40. /* symbols generated by blink */
  41. extern char __far _LibID[];        /* ID string */
  42. extern char __far _LibName[];        /* Name string */
  43. extern char __far RESLEN;        /* size of init data */
  44. extern long __far NEWDATAL;        /* size of global data */
  45. extern PFL _LibFuncTab[];        /* my function table */
  46. #define DATAWORDS ((long) &NEWDATAL)    /* magic to get right type of reloc */ 
  47. #define SIZEJMPTAB ((long) libbase->ml_origbase->ml_numjmps)
  48.                     /* size in bytes of jmp table */
  49. #define MYVERSION    2        /* version number */
  50. #define MYREVISION    51        /* revision number */
  51.  
  52. /* From libent.o, needed to determine where data is loaded by loadseg */
  53. extern long far _Libmergeddata; 
  54.  
  55. struct InitTable __far _LibInitTab =
  56. {
  57.    (long *)(&RESLEN + sizeof(struct MyLibrary)),
  58.    _LibFuncTab,
  59.    NULL,                /* will initialize my own data */
  60.    _LibInit,
  61.    };
  62.  
  63. /**********************************************************
  64.  *    ULONG _LibInit(APTR seglist, struct MyLibrary *libbase)
  65.  **********************************************************/
  66. __saveds __asm ULONG _LibInit( register __a0 APTR seglist,
  67.    register __d0 struct MyLibrary *libbase )
  68. {
  69.    long *reloc;
  70.    long *sdata;
  71.    char *ddata;
  72.    long nrelocs;
  73.  
  74.    libbase->ml_SegList = (ULONG) seglist;
  75.  
  76.    /* init. library structure (since I don't do automatic data init.) */
  77.    libbase->ml_Lib.lib_Node.ln_Type = NT_LIBRARY;
  78.    libbase->ml_Lib.lib_Node.ln_Name = _LibName;
  79.    libbase->ml_Lib.lib_Flags = LIBF_SUMUSED | LIBF_CHANGED;
  80.    libbase->ml_Lib.lib_Version = MYVERSION;
  81.    libbase->ml_Lib.lib_Revision = MYREVISION;
  82.    libbase->ml_Lib.lib_IdString = (APTR) _LibID;
  83.  
  84.    /* Start of copy of global data after structure */
  85.    ddata = (char *) libbase + sizeof(struct MyLibrary); 
  86.  
  87.    sdata = (long *) &_Libmergeddata;    /* where loadseg loaded the data */
  88.    memcpy(ddata, (void *) sdata, DATAWORDS * 4);
  89.    /*
  90.     * perform relocs if we want one global section for all programs
  91.     * that have this lib open. If we want a global section for each
  92.     * open, copy the relocs, and do them on each open call.
  93.     */
  94.    sdata = sdata + DATAWORDS;
  95.    nrelocs = *sdata;
  96.    sdata++;
  97.    while (nrelocs > 0)
  98.    {
  99.       reloc = (long *)((long) ddata + *sdata++);
  100.       *reloc += (long) ddata;
  101.       nrelocs--;
  102.       }
  103.    _UserLibInit(libbase);
  104.  
  105.    return ( (ULONG) libbase );
  106.    }    /* End of ULONG _LibInit() */
  107.  
  108. /**********************************************************
  109.  *    LONG _LibOpen(struct MyLibrary *libbase)
  110.  **********************************************************/
  111. LONG __saveds __asm _LibOpen( register __a6 struct MyLibrary *libbase )
  112. {
  113.    /* mark us as having another customer */
  114.    libbase->ml_Lib.lib_OpenCnt++;
  115.  
  116.    /* clear delayed expunges (standard procedure) */
  117.    libbase->ml_Lib.lib_Flags &= ~LIBF_DELEXP;
  118.  
  119.    return ( (LONG) libbase );
  120.    }    /* End of LONG _LibOpen() */
  121.  
  122. /**********************************************************
  123.  *    ULONG _LibClose(struct MyLibrary *libbase)
  124.  **********************************************************/
  125. ULONG __saveds __asm _LibClose( register __a6 struct MyLibrary *libbase )
  126. {
  127.    ULONG retval = 0;
  128.     
  129.    if (( --libbase->ml_Lib.lib_OpenCnt == 0 ) &&
  130.       ( libbase->ml_Lib.lib_Flags & LIBF_DELEXP ))
  131.    {
  132.       /* no more people have me open,
  133.        * and I have a delayed expunge pending
  134.        */
  135.       retval = _LibExpunge( libbase );        /* return segment list */
  136.       }
  137.  
  138.    return (retval);
  139.    }    /* End of ULONG _LibClose() */
  140.  
  141. /**********************************************************
  142.  *    ULONG _LibExpunge(struct MyLibrary *libbase)
  143.  **********************************************************/
  144. ULONG __saveds __asm _LibExpunge( register __a6 struct MyLibrary *libbase )
  145. {
  146.    ULONG seglist = 0;
  147.    LONG  libsize;
  148.  
  149.    libbase->ml_Lib.lib_Flags |= LIBF_DELEXP;
  150.    if ( libbase->ml_Lib.lib_OpenCnt == 0 )
  151.    {
  152.       /* really expunge: remove libbase and freemem */
  153.       _UserLibCleanup(libbase);
  154.       seglist = libbase->ml_SegList;
  155.  
  156.       Remove( (struct Node *) libbase);
  157.  
  158.       libsize = libbase->ml_Lib.lib_NegSize + libbase->ml_Lib.lib_PosSize;
  159.       FreeMem( (char *) libbase - libbase->ml_Lib.lib_NegSize, (LONG) libsize );
  160.       }
  161.  
  162.    /* return NULL or real seglist */
  163.    return ( (ULONG) seglist );
  164.    }    /* End of ULONG _LibExpunge() */
  165. /* End of Libinit.c source */
  166.